package com.jimo.basetools.utils;

import com.google.gson.*;
import com.google.gson.reflect.TypeToken;
import com.jimo.basetools.clazz.IntegerTypeAdapter;

import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.List;

public class JsonUtils {

    /**
     * obj 转 json
     * @param o
     * @return
     */
    public static String toJson(Object o) {
        Gson gson = new Gson();
        return gson.toJson(o);
    }

    /**
     * json 转 java类
     * @param <T> 类名
     * @param json json字符串
     * @param cls java类
     * @return
     */
    public static <T> T toClass(String json, Class<T> cls) {
        Gson gson = new Gson();
        return gson.fromJson(json, cls);
    }

    /**
     * json 转 list
     * @param <T> 类名
     * @param json json字符串
     * @param cls java类
     * @return
     */
    public static <T> List<T> toList(String json, Class<T[]> cls) {
        Gson gson = new Gson();
        T[] array = gson.fromJson(json, cls);
        return Arrays.asList(array);
    }

    /**
     * json 转 list
     * @param <T> 类名
     * @param json json字符串
     * @return List对象
     */
    public static <T> List<T> toList(String json) {
        Gson gson = new Gson();
        return gson.fromJson(json, new TypeToken<List<T>>(){}.getType());
    }

    /**
     * json转JsonElement对象
     * @param json json字符串
     * @return
     */
    public static JsonElement toJsonTree(String json) {
        Gson gson = new Gson();
        return gson.toJsonTree(json);
    }

    /**
     * object 转 JsonElement
     * @param o 对象
     * @return
     */
    public static JsonElement toJsonTree(Object o) {
        Gson gson = new Gson();
        return gson.toJsonTree(toJson(o));
    }

    /**
     * 校验json是否符合规范
     * @param jsonString json字符串
     * @return true:符合|false:不符合
     */
    public static boolean validate(String jsonString) {
        try {
            JsonElement element = JsonParser.parseString(jsonString);
            return element.isJsonObject() || element.isJsonArray();
        } catch (JsonSyntaxException jse) {
            return false;
        }
    }

    /**
     * 格式化json文件
     * @param jsonString json字符串
     * @return 格式化后的json数据
     */
    public static String jsonFormat(String jsonString) {
        if (validate(jsonString)) {
            Gson gson = new GsonBuilder()
                            .registerTypeAdapter(Integer.class, new IntegerTypeAdapter())
                            .setPrettyPrinting()
                            .setLenient()
                            // 排除 LOWER_CASE_WITH_UNDERSCORES 策略
                            .excludeFieldsWithModifiers(Modifier.TRANSIENT)
                            .create();
            return gson.toJson(gson.fromJson(jsonString, Object.class));
        } else {
            throw new JsonSyntaxException("JSON is not in compliance with the specifications.");
        }
    }
}
